// 单点登录核心类
import axios from 'axios';
import { PageEnum } from '/@/enums/pageEnum';
import { useGlobSetting } from '/@/hooks/setting';
import { useMessage } from '/@/hooks/web/useMessage';
import { getProcessUrl, getUrlParameter } from '/@/utils/common/urlUtils';

// 获取全局设置
const globSetting = useGlobSetting();
// 获取是否开启单点登录的配置
const openSso = globSetting.openSso;
const { createMessage } = useMessage();

// 单点登录功能模块
export const useSso = () => {
  /**
   * 执行单点登录操作
   * - 如果开启了单点登录，则检查用户是否已登录
   */
  const ssoLogin = async () => {
    if (openSso === 'true') {
      await checkIsLogin();
    }
  };

  /**
   * 发起ssoAjax请求的通用函数
   * @param {string} path - 请求的路径
   * @param {object} data - 请求的数据
   * @param {function} successFn - 请求成功后的回调函数
   */
  const ssoAjax = async (path, data, successFn, config?) => {
    // 获取服务器URL
    const serverUrl = useGlobSetting().casBaseUrl || '/';
    const headersDefault = {
      'Content-Type': 'application/x-www-form-urlencoded',
      satoken: localStorage.getItem('satoken'),
    };
    try {
      const response = await axios({
        url: serverUrl + path,
        method: 'post',
        data: data,
        headers: config?.headers || headersDefault,
      });
      const res = response.data;
      successFn(res);
    } catch (error) {
      console.error('异常：', error);
      createMessage.error('登录失败，请联系一站式平台管理员');
    }
  };

  /**
   * 检查当前会话是否已经登录
   */
  const checkIsLogin = async () => {
    try {
      // 从URL参数中获取ticket
      const ticket = getUrlParameter('ticket');
      if (ticket) {
        // 如果存在ticket，则进行ticket登录
        await doLoginByTicket(ticket);
        return;
      }
      // 发起是否登录的ssoAjax请求
      await ssoAjax('/sso/isLogin', {}, async (res) => {
        console.log('/sso/isLogin 返回数据：', res);
        if (!res.data) {
          // 如果未登录，则重定向至认证中心
          await goSsoAuthUrl();
        }
      });
    } catch (error) {
      console.error('检查登录状态时出错：', error);
    }
  };

  /**
   * 重定向至一站式平台认证中心
   */
  const goSsoAuthUrl = async () => {
    try {
      // 获取一站式平台认证URL
      await ssoAjax('/sso/getSsoAuthUrl', { clientLoginUrl: location.href }, (res) => {
        console.log('/sso/getSsoAuthUrl 返回数据', res);
        const topWindow = window.top;
        const isIframe = topWindow !== window;
        if (isIframe) {
          // 一站式平台内嵌
          // 发送消息给一站式平台
          const targetOrigin = getProcessUrl(res.data) ?? '';
          try {
            window.parent.postMessage({ type: 'logout' }, targetOrigin);
          } catch (error) {
            console.error(error);
          }
        } else {
          // 非嵌套
          // 重定向至认证URL
          location.href = res.data;
        }
      });
    } catch (error) {
      console.error('获取认证URL时出错：', error);
    }
  };

  /**
   * 根据ticket值进行登录
   * @param {string} ticket - 一站式平台认证中心返回的ticket
   */
  const doLoginByTicket = async (ticket) => {
    try {
      // 使用ticket进行登录
      await ssoAjax(
        '/sso/doLoginByTicket',
        { ticket: ticket },
        (res) => {
          console.log('/sso/doLoginByTicket 返回数据', res);
          if (res.code === 200) {
            // 登录成功，存储token，并跳转至首页
            localStorage.setItem('satoken', res.data);
            const replaceUrl = getProcessUrl(location.href, ['ticket']);
            window.location.replace(replaceUrl || PageEnum.BASE_HOME);
          } else {
            console.error('登录失败', res?.data);
          }
        },
        {
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
          },
        }
      );
    } catch (error) {
      console.error('通过ticket登录时出错：', error);
    }
  };

  return { ssoLogin };
};
